home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
tools
/
ivl
/
src
/
ivl_ftbl.c
< prev
next >
Wrap
Text File
|
2000-06-18
|
6KB
|
203 lines
/*
#define DEBUG
* ivl
*
* ファイルリスト登録管理
*
* from Jun.26,1999 by dummy.x.(with J-SAGA INDUSTRY)
*/
#include <stddef.h>
#include <string.h>
#include "comtype.h"
#include "easymac.h"
#include "sysconst.h"
#include "dummyc.h"
#include "hufilec.h"
#include "libpt4.h"
#include "ivl.h"
#include "mkpathfn.c"
/* 定数定義 */
#define FILE_TBL_BLOCK 64 /* ファイル名管理テーブルの1ブロックに含まれるファイル数 */
/* 大域変数 */
/* 表示ファイル管理 */
long arg_file_kaz; /* 管理ファイル数 */
filelist_t *arg_file_tblp; /* ファイル管理テーブルアドレス */
/* ファイル内変数 */
static long arg_file_tbl_max; /* 現在のテーブルで管理できるファイル数 */
static char arg_file_tbl_alloc_failed; /* テーブル拡張失敗フラグ(=!0:既に失敗している) */
/* ファイル管理テーブルを拡張する
* 返値: 拡張できればそのテーブルメモリアドレス
* できなかった場合は NULL
* 注記 * 関連する各ファイル内変数の値を直接書き替える。
*/
static
filelist_t *enhance_file_tbl(void)
{
filelist_t *nptblp = arg_file_tblp;
long curtblmax = arg_file_tbl_max;
curtblmax += FILE_TBL_BLOCK; /* 登録数増加 */
nptblp = (filelist_t *)realloc(nptblp, (curtblmax * sizeof(filelist_t)));
/* メモリ拡張 */
/* 拡張に成功したらファイル内変数を書き替える */
if (nptblp != NULL) {
arg_file_tblp = nptblp;
arg_file_tbl_max = curtblmax;
}
return nptblp;
}
/* DOS _FILES データ同士を比較して、同じファイルかを調べる
* 引数: files0p,files1p - 比較対象データへのポインタ
* 返値: 同じファイルならば !0、違っていれば 0
*/
static
int is_same_filesbuf(const _filesbuf_t *files0p, const _filesbuf_t *files1p)
{
int result;
#if 0
if (chkbit(state_flag_bits. FBIT_FNCASE)) { /* ファイル名の大小文字が有効 */
/* ファイル名以外はそのまま比較、
* ファイル名は文字列比較('\0'以降のゴミを考慮して)
*/
result = (memcmp(files0p, files1p, offsetof(_filesbuf_t, name)) == 0)
&& (strcmp(files0p->name, files1p->name) == 0);
} else { /* ファイル名の大小文字は無効 */
/* ファイル名に関する部分は文字列比較(大小無視で)
* ファイル名以外はそのまま比較
*/
int i, j, k;
i = offsetof(_filesbuf_t, filename);
j = sizeof(files1p->filename) + sizeof(files1p->ext);
k = offsetof(_filesbuf_t, name) - offsetof(_filesbuf_t, atr);
result = (memcmp(files0p, filesc1p, i) == 0)
&& (strnicmp(files0p->filename, files1p->filename, j) == 0)
&& (memcmp(files0p->atr, files1p->atr, k) == 0)
&& (strncmp(files0p->name, files1p->name) == 0);
}
#else
int i, j, k;
i = offsetof(_filesbuf_t, filename);
j = sizeof(files1p->filename) + sizeof(files1p->ext);
k = offsetof(_filesbuf_t, name) - offsetof(_filesbuf_t, atr);
result = (memcmp(files0p, files1p, i) == 0)
&& (strnicmp(files0p->filename, files1p->filename, j) == 0)
&& (memcmp(&(files0p->atr), &(files1p->atr), k) == 0)
&& (stricmp(files0p->name, files1p->name) == 0);
#endif
return result;
}
/* 同じファイルが既にリストに登録されているか調べる
* 引数: entno - リスト登録番号
* filesp - DOS _FILES バッファアドレス
* 返値: 登録されていれば !0、なければ 0
*/
static
int is_entried_file(int entno, const _filesbuf_t *filesp)
{
const filelist_t *flistp = arg_file_tblp + entno;
while (--flistp >= arg_file_tblp) {
if (is_same_filesbuf(filesp, &(flistp->fbuf))) {
/* 同じファイルあり! */
return !0;
}
}
/* 結局同じファイルはなかった */
return 0;
}
/* ファイル名を管理テーブルへ登録する
* 引数: pathp - ファイル存在パス名へのポインタ
* filesp - DOS _FILES バッファアドレス
* 返値: 登録番号(0~)
* 某かの理由で失敗した場合は <0
*/
long entry_arg_file_name(const char *pathp, const _filesbuf_t *filesp)
{
int entno = arg_file_kaz;
char rdres;
short wdots = -1, hdots = -1;
pt4_struct_t *rdbufp;
char *cp;
filelist_t *flistp;
/* テーブル拡張に失敗してたらファイル名の登録はなし */
if (arg_file_tbl_alloc_failed) {
return -1;
}
/* 用意したテーブルが一杯になってたら拡張する */
if (entno >= arg_file_tbl_max) {
if (enhance_file_tbl() == NULL) { /* 拡張失敗 */
ttlprintf("ファイル名管理テーブルの拡張に失敗しました。\n");
ttlprintf("%s%s 以降に指定されたファイルは表示できません。\n"
, pathp, filesp->name);
arg_file_tbl_alloc_failed = !0; /* 失敗したフラグをセット */
return -1;
}
}
/* パス名複製 */
cp = strdup(pathp);
if (cp == NULL) { /* 複製失敗 */
ttlprintf("ファイル %s%s をテーブル登録できなかったため、表示できません。\n"
, pathp, filesp->name);
return -2;
}
/* 同じファイルが既に登録されていないか調べる */
if (is_entried_file(entno, filesp)) { /* 同じファイルあり! */
_DEBUGJOB(ttlprintf("ファイル %s%s は既にテーブル登録済みです。\n", pathp, filesp->name));
return -3; /* 登録せずに返る */
}
/* 複製ファイル名アドレスをテーブルに登録 */
flistp = arg_file_tblp + entno;
if (chkbit(state_flag_bits, FBIT_ONMEMORY)) { /* 先行読み込みする */
rdres = read_pt4(&rdbufp, make_path_filename(cp, filesp));
if (rdres == RDPT4_SUCCESS) {
wdots = rdbufp->width;
hdots = rdbufp->height;
/* } else {
wdots = hdots = -1;
*/ }
} else if (chkbit(state_flag_bits, FBIT_ONMEM_SZ)) { /* サイズだけ先行読み込み */
pt4_struct_t phed;
rdres = read_pt4_head(&phed, make_path_filename(cp, filesp));
if (rdres == RDPT4_SUCCESS) {
rdres = RDPT4_READ_FAIL; /* 読み込み失敗としておく */
wdots = phed.width;
hdots = phed.height;
/* } else {
wdots = hdots = -1;
*/ }
} else { /* 先行読み込みしない */
rdres = RDPT4_READ_FAIL;
rdbufp = NULL;
/* wdots = hdots = -1;
*/ }
flistp->rdresult = rdres; /* 読み込み結果 */
flistp->pathp = cp; /* パス名 */
flistp->fbuf = *filesp; /* DOS _FILES データ */
flistp->rdbufp = rdbufp; /* 読み込みバッファアドレス */
flistp->wdots = wdots; /* 横幅 */
flistp->hdots = hdots; /* 縦高 */
arg_file_kaz++; /* 管理ファイル数計上 */
return entno;
}